"use strict";
let TSname; //此时TSname就只能是字符串型数据了，不能在通过赋值改变数据类型，会报错
let TSage; //此时TSage就只能是数字型数据了，不能在通过赋值改变数据类型，会报错
let TSresolve; //此时TSresolve就只能是布尔型数据了，不能在通过赋值改变数据类型，会报错
// let 变量名 ： 类型,类型推荐小写，别写String这种大写，因为这两种是有差异的，下面后续有解释
TSname = '夜南学ts';
// TSname = 115   //报错
TSage = 18;
// TSage = '18'   //报错
TSresolve = false;
// TSresolve = 19   //报错
// 这里count只能且必须接收两个参数(多一个少一个都报错)，
// 且x,y这个两个参数就只能接收数字型的参数，否则报错
function count(x, y) {
    return x + y;
}
// let result01 = count(1)      //报错
// let result02 = count(1,2,3)    //报错
let result1 = count(1, 2);
console.log('result1', result1);
// 这里add方法就只能 return 数字型的结果，否则报错
function add(x, y) {
    // return '这是一个字符串'   //报错
    return x + y;
}
let result2 = add(3, 4);
console.log('result2', result2);
// console.log(`count('sss',2)`,count('sss',2));   //报错
// console.log(`count('true',2)`,count(true,2));   //报错
// 字面量类型
let yeNan; //这里yeNan就只能存hello这个字符串，其余数据全报错
// yeNan = 'yenanmanjian'   //报错
// 原始数据类型，如number、string等等，在js中是最简单的数据类型，他们在内存中占用空间少，处理速度快。
// 自动装箱: JS在必要时会自动将原始类型包装成对象，以便调用方法或者访问属性
let mystring; //TS官方推荐写法
mystring = 'hello';
// mystring = new String('hello')   //报错
let myStr;
myStr = 'yenan';
myStr = new String('yenan');
//虽然这种写法两种类型都能写，不报错，但是性能上不如上面小写的
// 因为new String()是使用了js的包装对象，是复杂数据类型，在内存中占用更多空间，在日常开发时很少由开发人员自己创建包装对象
// 浅谈装箱:
let testStr = 'hello';
console.log('testStr', testStr.length); //会打印5，但是字符串时没有length属性的
//  当访问testStr.length时，JS引擎做了以下工作
let size = (function () {
    // 1、自动装箱:创建一个临时的String对象包装原始字符串
    let tempStringObject = new String(testStr);
    // 2、访问String对象的length属性
    let lengVaule = tempStringObject.length;
    // 3销毁临时对象，返回长度值
    // (js引擎自动处理对象销毁，开发者无感知)
    return lengVaule;
})();
console.log('size', size);
